<?php

namespace app\controller;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;

class Pay extends BaseController
{

    // http://www.penyou.com/Pay/alipay
    public function alipay()
    {
        $order_id = Request::param('order_id');
        $order_info = Db::name('pay')->field('order_no,title,type,order_money')->where(array('id' => $order_id))->find();
        if (empty($order_info)) {
            $this->error('该订单不存在或已支付');
        }
        $payData = array(
            'out_trade_no' => $order_info['order_no'], // 商户订单号
            'total_amount' => $order_info['order_money'],    // 支付金额
            'subject' => $order_info['title'], // 支付订单描述
        );


        $configs = getConfig();

        $config = [
            // 沙箱模式
            'debug' => false,
            // 签名类型 ( RSA|RSA2 )
            'sign_type' => 'RSA2',
            // 应用ID
            'appid' => $configs['alipay_app_id'],
            // 应用私钥内容 ( 需1行填写，特别注意：这里的应用私钥通常由支付宝密钥管理工具生成 )
            'private_key' => $configs['alipay_private_key'],
            // 公钥模式，支付宝公钥内容 ( 需1行填写，特别注意：这里不是应用公钥而是支付宝公钥，通常是上传应用公钥换取支付宝公钥，在网页可以复制 )
            'public_key' => $configs['alipay_public_key'],
            // 证书模式，应用公钥证书路径 ( 新版资金类接口转 app_cert_sn，如文件 appCertPublicKey.crt )
            'app_cert_path' => __DIR__ . '/alipay/appPublicCert.crt', // 'app_cert' => '证书内容',
            // 证书模式，支付宝根证书路径 ( 新版资金类接口转 alipay_root_cert_sn，如文件 alipayRootCert.crt )
            'alipay_root_path' => __DIR__ . '/alipay/alipayRootCert.crt', // 'root_cert' => '证书内容',
            // 证书模式，支付宝公钥证书路径 ( 未填写 public_key 时启用此参数，如文件 alipayPublicCert.crt )
            'alipay_cert_path' => __DIR__ . '/alipay/alipayPublicCert.crt', // 'public_key' => '证书内容'
            // 支付成功通知地址
            'notify_url' => $configs['url'] . '/Pay/nofify',
            // 网页支付回跳地址
            'return_url' => $configs['url'] . '/Member/orders',
        ];
        try {
            $pay = \We::AliPayWeb($config);

            // 参考链接：https://docs.open.alipay.com/api_1/alipay.trade.page.pay
            $result = $pay->apply($payData);

            echo $result; // 直接输出HTML（提交表单跳转)

        } catch (Exception $e) {

            // 异常处理
            echo $e->getMessage();

        }
    }

    public function wxpay()
    {
        $config = [
            'token' => 'test',
            'appid' => 'wxb8fa833f1a33c55d',
            'appsecret' => '789e74941930f1e7931743275a34362b',
            'encodingaeskey' => 'BJIUzE0gqlWy0GxfPp4J1oPTBmOrNDIGPNav1YFH5Z5',
            // 配置商户支付参数（可选，在使用支付功能时需要）
            'mch_id' => "1540463071",
            'mch_key' => 'hjlaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
            // 配置商户支付双向证书目录（可选，在使用退款|打款|红包时需要）
            'ssl_key' => '',
            'ssl_cer' => '',
            // 缓存目录配置（可选，需拥有读写权限）
            'cache_path' => '',
        ];
        $wechat = new \WeChat\Pay($config);

        // 组装参数，可以参考官方商户文档
        $options = [
            'body' => '测试商品',
            'out_trade_no' => time(),
            'total_fee' => '1',
            'openid' => 'o38gpszoJoC9oJYz3UHHf6bEp0Lo',
            'trade_type' => 'JSAPI',
            'notify_url' => 'http://a.com/text.html',
            'spbill_create_ip' => '127.0.0.1',
        ];

        try {

            // 生成预支付码
            $result = $wechat->createOrder($options);

            // 创建JSAPI参数签名
            $options = $wechat->createParamsForJsApi($result['prepay_id']);

            // @todo 把 $options 传到前端用js发起支付就可以了

        } catch (Exception $e) {

            // 出错啦，处理下吧
            echo $e->getMessage() . PHP_EOL;

        }

    }

    // http://www.penyou.com/Pay/alipay_nofify
    public function alipay_nofify()
    {

        $_POST['out_trade_no'] = '2023111819355396453';
        $_POST['trade_no'] = date('YmdHis');
        $order_no = $_POST['out_trade_no'];
        $trade_no = $_POST['trade_no'];
        $pay_type = 'alipay';

        $this->notify($order_no, $trade_no, $pay_type);




    }

    public function wx_notify()
    {
//        $verify = $this->pay->driver('wechat')->gateway('scan')->verify(file_get_contents('php://input'));
//        if ($verify) {
//            $out_trade_no = $verify['out_trade_no'];
//            $payment_order_info = Db::name("payment_order")->where("order_no", $out_trade_no)->find();
    }
    // http://www.penyou.com/Pay/notify
    public function notify($order_no, $trade_no, $pay_type=''):void
    {

        file_put_contents("ali_notify_log.txt", "时间2：" . date("Y-m-d H:i:s") . " - " . serialize($_POST) . PHP_EOL, FILE_APPEND);

        $order_info = Db::name('pay')->field('id,uid,title,type,duration,order_money')->where(array('order_no' => $order_no, 'is_pay' => 0))->find();
//        echo "<hr>".time();
        if ($order_info) {
            // 设置支付状态
            Db::name('pay')->where(array('id' => $order_info['id']))->update(array('is_pay' => 1,'trade_no'=>$trade_no,'pay_type'=>$pay_type));

            // 更改vip时间
            if ($order_info['type'] === 'vip') {
                $user_info = Db::name('users')->field('vip_time')->where(array('id' => $order_info['uid']))->find();

                $vip_time_start = $user_info['vip_time'] > date('Y-m-d') ? $user_info['vip_time'] : date('Y-m-d');

                $vip_time_end = date("Y-m-d",strtotime($vip_time_start) + $order_info['duration']);

                Db::name('users')->where(array('id' => $order_info['uid']))->update(array('vip_time' => $vip_time_end));
//    echo Db::name('users')->getlastsql();

            }
        }

    }


}
